/**
 * 使用wx自定义小程序全局方法和全局变量
 */
const xpp = require('xpp.js');

wx.$extend = function (obj) {
    for (var key in obj) {
        if (key.indexOf('$') == 0) {
            this[key] = obj[key];
        }
    }
}

//图片选择及上传
var ChooseImage = {
    $img_upload: function (callback) {
        wx.chooseImage({
            count: 9, //默认9
            sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图，默认二者都有
            sourceType: ['album'], //从相册选择
            success: (res) => {
                wx.showLoading({
                    title: '上传中...',
                })
                var tempLen = res.tempFilePaths.length;
                //递归处理上传文件
                wx.$img_UploadImg(res.tempFilePaths, tempLen, 0, [], callback);
            }
        });
    },
    $img_UploadImg: function (tempFilePaths, len, index, arr, callback) {
        wx.$requestApi("interface/toInterface/upload64", {
            base64Code: "data:image/jpeg;base64," + wx.getFileSystemManager().readFileSync(tempFilePaths[index], 'base64')
        }, function (data) {
            arr.push(data);
            if (len == (index + 1)) { //所有处理完成
                wx.hideLoading();
                callback(arr);
            } else {
                wx.$img_UploadImg(tempFilePaths, len, index + 1, arr, callback);
            }
        })
    }
}

//正则验证
var Reg = {
    /**
     * 手机号码验证
     * @param {验证值} v 
     * @param {是否验证座机} t 
     */
    $reg_phone: function (v, t = false) {
        if (t) {
            if (/^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$/.test(v) || /^1(3|4|5|6|7|8|9)\d{9}$/.test(v)) {
                return true;
            }
            return false;
        }
        return (/^1(3|4|5|6|7|8|9)\d{9}$/.test(v));
    },
    /**
     * 身份证验证
     * @param {验证值} v 
     */
    $reg_idcard: function (v) {
        v = wx.$trim(v.replace(/ /g, "")); //去掉字符串头尾空格
        if (v.length == 15) {
            //进行15位身份证的验证
            var year = v.substring(6, 8);
            var month = v.substring(8, 10);
            var day = v.substring(10, 12);
            var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day));
            // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法
            if (temp_date.getYear() != parseFloat(year) ||
                temp_date.getMonth() != parseFloat(month) - 1 ||
                temp_date.getDate() != parseFloat(day)) {
                return false;
            } else {
                return true;
            }
        } else if (v.length == 18) {
            var a_v = v.split(""); // 得到身份证数组
            var flag1 = false;
            var flag2 = false;
            //判断身份证号码为18位时最后的验证位是否正确
            var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]; // 加权因子
            var ValideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];
            var sum = 0; // 声明加权求和变量
            if (a_v[17].toLowerCase() == 'x') {
                a_v[17] = 10; // 将最后位为x的验证码替换为10方便后续操作
            }
            for (var i = 0; i < 17; i++) {
                sum += Wi[i] * a_v[i]; // 加权求和
            }
            var valCodePosition = sum % 11; // 得到验证码所位置
            if (a_v[17] == ValideCode[valCodePosition]) {
                flag1 = true;
            }
            //验证18位数身份证号码中的生日是否是有效生日
            var year = v.substring(6, 10);
            var month = v.substring(10, 12);
            var day = v.substring(12, 14);
            var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day));
            // 这里用getFullYear()获取年份，避免千年虫问题
            if (temp_date.getFullYear() != parseFloat(year) ||
                temp_date.getMonth() != parseFloat(month) - 1 ||
                temp_date.getDate() != parseFloat(day)) {
                flag2 = false;
            } else {
                flag2 = true;
            }
            if (flag2 && flag1) { //进行18位身份证的基本验证和第18位的验证
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    },
    /**
     * 邮箱验证
     * @param {验证值} v 
     */
    $reg_email: function (v) {
        return /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/.test(v);
    }
}
//公用方法
var Common = {
    $trim: function (str) {
        return str.replace(/(^\s*)|(\s*$)/g, "");
    }
}
//转换
var Trans = {
    /**
     * sha1
     * @param {值} v 
     */
    $to_sha1: function (v) {
        return (xpp.Crypto.SHA1(v)).toString();
    },
    /**
     * json to string
     * @param {值} o 
     */
    $to_encode: function (o) {
        return JSON.stringify(o);
    },
    /**
     * string to json
     * @param {值} s 
     */
    $to_decode: function (s) {
        return JSON.parse(s);
    },
    /**
     * base64
     * @param {值} v 
     */
    $to_encodeBase64: function (v) {
        return xpp.Crypto.Base64.encode(v);
    },
    /**
     * base64
     * @param {值} v 
     */
    $to_decodeBase64: function (v) {
        return xpp.Crypto.Base64.decode(v);
    },
    /**
     * 时间戳转日期
     * @param {时间戳} d 
     * @param {日期格式} f 
     */
    $to_encodeTime: function (d, f) {
        let formateArr = ['Y', 'M', 'D', 'h', 'm', 's'];
        let date = new Date(d * 1000);
        let returnArr = [
			date.getFullYear(),
			date.getMonth() + 1,
			date.getDate(),
			date.getHours(),
			date.getMinutes(),
			date.getSeconds()
        ].map(item => item = item.toString()[1] ? item : `0${item}`);
      
        for (let i in returnArr) {
            f = f.replaceAll(formateArr[i], returnArr[i]);
        }
        return f;
    },
    /**
     * 根据当前时间戳转描述(刚刚,1分钟前...昨天,前天...Y-M-D)
     * @param {时间戳} d 
     * @param {日期格式 默认2022-03-21} f 
     */
    $to_encodeTimeWords: function (d, f = "Y-M-D") {
        let t = new Date(new Date().toLocaleDateString()).getTime() / 1000; //获取当天零点点时间戳
        let n = Date.parse(new Date()) / 1000; //获取当前时间戳
        let s = this.$to_encodeTime(d, f);
        if (d >= t) {
            if ((n - d) <= 5*60) {
                s = "刚刚";
            } else if ((n - d) > 5*60 && (n - d) <= 3600) {
                s = `约${(parseInt((n - d) / 60))}分钟前`;
            } else {
                s = `今天 ${this.$to_encodeTime(d, "h:m:s")}`;
            }
        } else if ((t - d) <= 86400) {
            s = `昨天 ${this.$to_encodeTime(d, "h:m:s")}`;
        }
        return s;
    },
    /**
     * 日期转时间戳
     * @param {日期} t 
     */
    $to_decodeTime: function (t) {
        return Date.parse(new Date(t)) / 1000;
    }
}
//wx二次封装
var Wxgcs = {
    /**
     * wx.showToast()
     * @param {title} a 
     * @param {icon} b 
     * @param {duration} c 
     */
    $gcs_showToast: function (a, b = 'none', c = 2000) {
        wx.showToast({
            title: a,
            icon: b,
            duration: c
        })
    },
    /**
     * wx.showLoading() wx.hideLoading() a=>false
     * @param {title} a 
     */
    $gcs_showLoading: function (a = "加载中...") {
        if (!a) {
            wx.hideLoading();
        } else {
            wx.showLoading({
                title: a,
            })
        }
    }
}
//添加方法
wx.$extend(Common); //公共方法
wx.$extend(Reg); //正则验证
wx.$extend(Wxgcs); //二次封装
wx.$extend(Trans); //转换
wx.$extend(ChooseImage); //图片上传